package ygg.exporter.swf.tag
{
	import j.sus2maj7.encoding.*;
	import j.sus2maj7.context.*;
	import j.sus2maj7.util.*;
	
	import flash.filesystem.*;
	import flash.utils.*;
	
	import ygg.exporter.swf.*;
	
	import ygg.encoding.swf.tag.*;
	import ygg.encoding.swf.tag.object.*;
	import ygg.encoding.swf.structure.*;
	import ygg.encoding.swf.abc.*;
	import ygg.encoding.swf.abc.object.*;
	
	public class DefineBitsLossless2Exporter extends TagExporter
	{
		public function DefineBitsLossless2Exporter()
		{
			super();
		}
		
		override public function export(o:*, context:IContext = null):void
		{
			trace('DefineBitsLossless2Exporter');
			var p:DefineBitsLossless = o as DefineBitsLossless;
			//o = o as DefineBitsLossless;
			// Create output byte array
			var png:ByteArray = new ByteArray();
			// Write PNG signature
			png.writeUnsignedInt(0x89504e47);
			png.writeUnsignedInt(0x0D0A1A0A);
			
			// Build IHDR chunk
			var IHDR:ByteArray = new ByteArray();
			IHDR.writeInt(p.bitmapWidth);
			IHDR.writeInt(p.bitmapHeight);
			IHDR.writeUnsignedInt(0x08060000); // 32bit RGBA
			IHDR.writeByte(0);
			PngEnc.writeChunk(png, 0x49484452, IHDR);
			
			//trace ( ByteUtil.print( p.zlibBitmapData.ba) );
			p.zlibBitmapData.ba.uncompress();
			
			var bd:ByteArray = new ByteArray();
			p.zlibBitmapData.position = 0;
			p.zlibBitmapData.readBytes(bd);
			
			var IDAT:ByteArray = new ByteArray();
			var i:int;
			var j:int;
			var px:uint;
			//trace('a');
			if (p.bitmapFormat == 5)
			{//trace('b');
				for (i = 0; i < p.bitmapHeight; i++)
				{
					
					// no filter
					IDAT.writeByte(0);
					
					for (j = 0; j < p.bitmapWidth; j++)
					{
						px = bd.readUnsignedInt();
						IDAT.writeUnsignedInt( uint(((px&0xFFFFFF) << 8)| (px>>>24)));
					}
					
				}
			}
			else
			{//trace('c');
				var ctRGB:ByteArray = new ByteArray();
				bd.readBytes(ctRGB, 0, (p.bitmapColorTableSize + 1)<<2);
				
				var cpd:ByteArray = new ByteArray();
				bd.readBytes(cpd);
				
				//trace(ctRGB.length, cpd.length, p.bitmapWidth, p.bitmapHeight);
				var k:int = p.bitmapWidth % 4;
				k = 4 - k;
				for (i = 0; i < p.bitmapHeight; i++)
				{
					// no filter
					IDAT.writeByte(0);
					
					for (j = 0; j < p.bitmapWidth; j++)
					{
						ctRGB.position = cpd.readUnsignedByte() << 2;
						//trace(j, ctRGB.position);
						var rgba:uint = ctRGB.readUnsignedInt();
						//trace(rgba.toString(16));
						IDAT.writeUnsignedInt(rgba);
					}
					
					//skip padding
					
					cpd.position += k;
				}
				
			}
			
			IDAT.compress();
			PngEnc.writeChunk(png,0x49444154, IDAT);
			// Build IEND chunk
			PngEnc.writeChunk(png,0x49454E44,null);
			// return PNG
			
			
			var f:File = context.vars.imageDir.resolvePath('lossless2_' + p.characterId + '_' + p.bitmapFormat +  '.png');
			
			writeBytesToFile(png, f);
		}
	}
}